FUNCTION BUBBLE_SORT : BOOL
  VAR_INPUT
    // 指向待排序整数数组的引用
    pData : REF_TO INT;
    // 数组元素个数
    uiSize : UDINT;
  END_VAR

  VAR
    // 外层循环计数器
    i : UDINT;
    // 内层循环计数器
    j : UDINT;
    // 交换时的临时变量
    temp : INT;
    // 标记本轮是否发生交换
    swapped : BOOL;
  END_VAR

  // 检查输入参数有效性
  IF pData = 0 OR uiSize <= 1 THEN
    BUBBLE_SORT := FALSE;
    RETURN;
  END_IF;

  // 冒泡排序算法
  FOR i := 0 TO uiSize - 2 DO
    swapped := FALSE;
    
    FOR j := 0 TO uiSize - 2 - i DO
      // 比较相邻元素，如果前一个大于后一个则交换
      IF (pData+j)^ > (pData+j+1)^ THEN
        temp := (pData+j)^;
        (pData+j)^ := (pData+j+1)^;
        (pData+j+1)^ := temp;
        swapped := TRUE;
      END_IF;
    END_FOR;
    
    // 如果本轮没有发生交换，说明数组已经有序，可以提前退出
    IF NOT swapped THEN
      EXIT;
    END_IF;
  END_FOR;

  BUBBLE_SORT := TRUE;

END_FUNCTION
